/**
 * https://leetcode-cn.com/problems/count-and-say/
 * 外观数列
 * 给定一个正整数 n ，输出外观数列的第 n 项。「外观数列」是一个整数序列，从数字 1 开始，序列中的每一项都是对前一项的描述。你可以将其视作是由递归公式定义的数字字符串序列
 * @param n 
 * @returns 
 */
const countAndSay = (n: number): string => {

    let ans = '1'

    for (let i = 2; i <= n; i++) {
        ans = getSay(ans)
    }
    
    
    return ans
};

/**
 * "说"出字符串
 * @param n 
 * @returns 
 */
const getSay = (str: string): string => {
    const len = str.length;

    // 当前计数
    let count = 1;
    // 前一个
    let prev = str[0]

    // 得到数字的结果
    let ans = ''
    for (let i = 1; i < len; i++) {
        if (str[i] === prev) count++
        else {
            
            ans += (count + prev)

            // 更改prev
            prev = str[i]
            count = 1
        }
    }

    // 最后也需要加一次
    ans += (count + prev)

    return ans
}

console.log(countAndSay(5))